From 3c98b90fc61de21efd22cc37bf8a1e64c5142835 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 23 Sep 2017 08:59:06 -0400 Subject: [PATCH] vulkan: Implement nonseparable blendmodes This is a directly-from-the-spec, unoptimized implementation. --- gsk/gskvulkanrenderpass.c | 5 - .../vulkan/blendmode-clip-rounded.frag.spv | Bin 22744 -> 32700 bytes gsk/resources/vulkan/blendmode-clip.frag.spv | Bin 15972 -> 25928 bytes gsk/resources/vulkan/blendmode.frag | 127 +++++++++++++++++- gsk/resources/vulkan/blendmode.frag.spv | Bin 15972 -> 25928 bytes 5 files changed, 125 insertions(+), 7 deletions(-) diff --git a/gsk/gskvulkanrenderpass.c b/gsk/gskvulkanrenderpass.c index 3f9c7aa0c6..fe1187243c 100644 --- a/gsk/gskvulkanrenderpass.c +++ b/gsk/gskvulkanrenderpass.c @@ -186,11 +186,6 @@ gsk_vulkan_render_pass_add_node (GskVulkanRenderPass *self, FALLBACK ("Unsupported node '%s'\n", node->node_class->type_name); case GSK_BLEND_NODE: - if (gsk_blend_node_get_blend_mode (node) == GSK_BLEND_MODE_COLOR || - gsk_blend_node_get_blend_mode (node) == GSK_BLEND_MODE_HUE || - gsk_blend_node_get_blend_mode (node) == GSK_BLEND_MODE_SATURATION || - gsk_blend_node_get_blend_mode (node) == GSK_BLEND_MODE_LUMINOSITY) - FALLBACK ("Nonseparable blend modes not implemented\n"); if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds)) pipeline_type = GSK_VULKAN_PIPELINE_BLEND_MODE; else if (constants->clip.type == GSK_VULKAN_CLIP_RECT) diff --git a/gsk/resources/vulkan/blendmode-clip-rounded.frag.spv b/gsk/resources/vulkan/blendmode-clip-rounded.frag.spv index 4ede20eb07cb298a1cded6064e3c32c752b98818..b204175b0f5f5055bed90b8a8bb2f983f6483346 100644 GIT binary patch literal 32700 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 X-v3Ro{q$LT=khSv-1?lW+`0Zgy;h>Fq# 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 literal 15972 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 Bnm7Oe diff --git a/gsk/resources/vulkan/blendmode.frag b/gsk/resources/vulkan/blendmode.frag index 803a538d1d..4e448acd5c 100644 --- a/gsk/resources/vulkan/blendmode.frag +++ b/gsk/resources/vulkan/blendmode.frag @@ -10,7 +10,7 @@ layout(location = 3) flat in uint inBlendMode; layout(set = 0, binding = 0) uniform sampler2D startTexture; layout(set = 1, binding = 0) uniform sampler2D endTexture; -layout(location = 0) out vec4 color; +layout(location = 0) out vec4 outColor; vec3 multiply (vec3 source, vec3 backdrop, float opacity) @@ -134,6 +134,121 @@ exclusion (vec3 source, vec3 backdrop, float opacity) return mix (source, result, opacity); } +float +lum (vec3 c) +{ + return 0.3 * c.r + 0.59 * c.g + 0.11 * c.b; +} + +vec3 +clip_color (vec3 c) +{ + float l = lum (c); + float n = min (c.r, min (c.g, c.b)); + float x = max (c.r, max (c.g, c.b)); + if (n < 0) c = l + (((c - l) * l) / (l - n)); + if (x > 1) c = l + (((c - l) * (1 - l)) / (x - l)); + return c; +} + +vec3 +set_lum (vec3 c, float l) +{ + float d = l - lum (c); + return clip_color (vec3 (c.r + d, c.g + d, c.b + d)); +} + +float +sat (vec3 c) +{ + return max (c.r, max (c.g, c.b)) - min (c.r, min (c.g, c.b)); +} + +vec3 +set_sat (vec3 c, float s) +{ + float cmin = min (c.r, min (c.g, c.b)); + float cmax = max (c.r, max (c.g, c.b)); + vec3 res; + + if (cmax == cmin) + res = vec3 (0, 0, 0); + else + { + if (c.r == cmax) + { + if (c.g == cmin) + { + res.b = ((c.b - cmin) * s) / (cmax - cmin); + res.g = 0; + } + else + { + res.g = ((c.g - cmin) * s) / (cmax - cmin); + res.b = 0; + } + res.r = s; + } + else if (c.g == cmax) + { + if (c.r == cmin) + { + res.b = ((c.b - cmin) * s) / (cmax - cmin); + res.r = 0; + } + else + { + res.r = ((c.r - cmin) * s) / (cmax - cmin); + res.b = 0; + } + res.g = s; + } + else + { + if (c.r == cmin) + { + res.g = ((c.g - cmin) * s) / (cmax - cmin); + res.r = 0; + } + else + { + res.r = ((c.r - cmin) * s) / (cmax - cmin); + res.g = 0; + } + res.b = s; + } + } + return res; +} + +vec3 +color (vec3 source, vec3 backdrop, float opacity) +{ + vec3 result = set_lum (source, lum (backdrop)); + return mix (source, result, opacity); +} + +vec3 +hue (vec3 source, vec3 backdrop, float opacity) +{ + vec3 result = set_lum (set_sat (source, sat (backdrop)), lum (backdrop)); + return mix (source, result, opacity); +} + +vec3 +saturation (vec3 source, vec3 backdrop, float opacity) +{ + vec3 result = set_lum (set_sat (backdrop, sat (source)), lum (backdrop)); + return mix (source, result, opacity); +} + +vec3 +luminosity (vec3 source, vec3 backdrop, float opacity) +{ + vec3 result = set_lum (backdrop, lum (source)); + return mix (source, result, opacity); +} + float combine (float source, float backdrop) { @@ -176,8 +291,16 @@ void main() rgb = difference (source.rgb, backdrop.rgb, backdrop.a); else if (inBlendMode == 11) rgb = exclusion (source.rgb, backdrop.rgb, backdrop.a); + else if (inBlendMode == 12) + rgb = color (source.rgb, backdrop.rgb, backdrop.a); + else if (inBlendMode == 13) + rgb = hue (source.rgb, backdrop.rgb, backdrop.a); + else if (inBlendMode == 14) + rgb = saturation (source.rgb, backdrop.rgb, backdrop.a); + else if (inBlendMode == 15) + rgb = luminosity (source.rgb, backdrop.rgb, backdrop.a); else discard; - color = clip (inPos, vec4 (rgb, a)); + outColor = clip (inPos, vec4 (rgb, a)); } diff --git a/gsk/resources/vulkan/blendmode.frag.spv b/gsk/resources/vulkan/blendmode.frag.spv index 21484c8e1815cde307698321abe329557fd3c4cb..e3e681df6f58ef9c3ea41fbcc665bf88be83029e 100644 GIT binary patch literal 25928 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 literal 15972 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 Bnm7Oe -- 2.30.2